package org.linuxsogood.boot.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {


    /***
     * hasAuthority([auth])：等同于hasRole
     * hasAnyAuthority([auth1,auth2])：等同于hasAnyRole
     * hasRole([role])：当前用户是否拥有指定角色。
     * hasAnyRole([role1,role2])：多个角色是一个以逗号进行分隔的字符串。如果当前用户拥有指定角色中的任意一个则返回true
     * Principle：代表当前用户的principle对象
     * authentication：直接从SecurityContext获取的当前Authentication对象
     * permitAll()：总是返回true，表示允许所有的
     * denyAll()：总是返回false，表示拒绝所有的
     * isAnonymous()：当前用户是否是一个匿名用户
     * isAuthenticated()：表示当前用户是否已经登录认证成功了
     * isRememberMe()：表示当前用户是否是通过Remember-Me自动登录的
     * isFullyAuthenticated()：如果当前用户既不是一个匿名用户，同时又不是通过Remember-Me自动登录的，则返回true
     * hasPermission()：当前用户是否拥有指定权限
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 开户登陆页面(无访问权限时跳转到登陆页面,这个页面是内置的,也可以配置)
        http.formLogin();
        // 配置退出登陆后重写向的地址
        http.logout().logoutSuccessUrl("/");
        // /目录不做权限控制, 允许所有人访问
        // /springboot开头的目录允许admin和test角色进行访问
        // /work开头的目录,只允许admin角色进行访问
        http.authorizeRequests().antMatchers("/").permitAll()
                .antMatchers("/springboot/**").hasAnyRole("admin", "test")
                .antMatchers("/work/**").hasRole("admin");
        /*
        http.csrf().disable()
                .formLogin()
                .loginPage("/login.html")   //自定义登陆界面
                .loginProcessingUrl("/main.html")
                .failureUrl("/error.html")
                .usernameParameter("username")
                .passwordParameter("password")
                .permitAll()
                .and()
                .logout()
                .logoutUrl("/logout.action")
                .logoutSuccessUrl("/login.html")
                .permitAll()
                .and()
                .authorizeRequests()
                .antMatchers("/register*").permitAll()
                .mvcMatchers("/main.html").hasAnyRole("admin")
                .anyRequest().authenticated()
                .and().exceptionHandling().accessDeniedPage("/error.html");*/
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("admin").password(new BCryptPasswordEncoder().encode("123456")).roles("admin", "test")
                .and().withUser("test").password(new BCryptPasswordEncoder().encode("123123")).roles("test");
    }
}
